看我如何黑掉 Outlook 安卓 app,找到 CVE-2019-1105
编译:奇安信代码卫士团队
本文是对之前发布文章《Outlook App 安卓版被曝详情不明的 XXS 漏洞,影响1亿多用户》的详细技术分析。
发现
一切始于2018年12月,当时有个朋友发邮件让我帮忙看看他正在研究的某些 JavaScript 代码。虽然我在找漏洞方面并不积极,但我发现从安卓手机上看邮件格式看起来很奇怪。如下图是当时我收到的邮件截图。
那个灰色框是啥?我仔细查看后发现,这个 JavaScript 很可能包含通常情况下会在移动应用之外进行渲染的内联框架的 HTML 代码。但这看起来也很奇怪。而当我在笔记本查看代码,又是显示正常的,如图:
这让我感到很困惑:将内联框架嵌入邮件中的能力就已经是漏洞问题了。更糟糕的是,由于这个内联框架并未受拦截外部图像设置以阻止追踪像素和网络信标的影响。但如果攻击者能够获取在邮件中运行 JavaScript 的能力,那么就会存在更加危险的攻击向量。
于是,我尝试在邮件中插入一个脚本标记而非内联框架,结果失败了,这是好事。然而,我能够使用内联框架中的一个 JavaScript URL 规避这种情况。事情好像变得有点意思了。
经由邮件产生的存储型 XSS
在网络浏览器中,使用以 javascript 开头的 URL来运行 JavaScript 代码是可行的:但在网络浏览器中,独立域名上内联框架中的 JavaScript 不应该能够访问余下页面中的数据。在安卓版 Outlook 中并不存在这类限制。我的内联框架 JavaScript 能够完全访问 cookie、令牌甚至是一些邮件。不仅如此,我还能将它们发送给远程攻击者。
攻击者可通过发送带有 JavaScript 的邮件的方式利用这种漏洞。服务器转义 JavaScript 而且并没有发现这一点,因为它存在于内联框架中。交付时,邮件客户端会自动撤销转移并在客户端设备上运行 JavaScript。无疑,这就是一个存储型 XSS 漏洞。该代码能够帮助攻击者执行任何操作,包括窃取信息以及/或返发送信息。攻击者能够向用户发送邮件,而且在用户开始阅读邮件时就能窃取收件箱内容。如被武器化,它可转变为非常令人讨厌的恶意软件。
披露尝试
这是个大问题,所以我需要告知微软。在披露之前,我创建了一个简短的 PoC来展示漏洞情况。它运行了一个任意的外部脚本,窃取并泄露个人信息(不过得承认,它对邮件数据的访问权限很有限)。2018年12月10日,我将问题告知微软安全响应中心 (MSRC)。
此时,我并不能准确地知道到底是哪部分代码触发了这个漏洞。再说了,我也不可能知道啊,因为我没有访问 Outlook 源代码的权限。而且,我没有调试移动应用的经验。另外,我当时认为app 开发人员通过我的 PoC 发现问题应该是很容易的。
遗憾的是,工程团队并未能复现该漏洞。我很困惑还有点担心。这明明是存在的问题,而且我需要让微软解决。于是我发送了一个出现bug 的视频。之后我才知道另外一名研究员也报告了这个问题,但他的 PoC 也未能复现bug。
我测试了不同的Outlook 设置来查找造成偏差的原因,但未果。于是这件事暂时搁置了。
无复现,不 bug
几乎每个安全工程师和开发人员都会告诉你,无法复现已提交的漏洞真是让人头疼;而他们的时间对于业务而言是珍贵的且有限的资源。组织机构只能耗费那么多的精力来复现bug。如果无法复现,那么就合理地认为攻击者也无法复现。因此工程师和维护就此打住,并通常将责任推给研究人员,让后者找到创建 PoC 的方法以便安全工程师能够轻易确认、鉴别并期待修复。
突破
我无法释怀。几个月之后,我还在想着这个漏洞以及为微软安全工程师创建 PoC 的困难是什么。我仍然记得这个漏洞并且想到如何才能将渲染的 HTML 从 app 中提取出来。我意识到问题的关键在于漏洞本身!这个漏洞可使我从 app 中窃取数据,而我能够借此读取并提取 HTML。
我利用这一信息构建了一个新的 payload,如截图所示:
我构建的payload 如下:
<iframe src="javascript:alert(window. top. document. body. innerHTML+'')"
style="position:absolute;left:-2330px;" src=h
这个 payload 正确地在具有 HTML属性的服务器端上进行了转义,但客户端上的逃逸并未实现,而且 payload 被转换为:
<iframe src="javascript:alert(window. top. document. body. innerHTML+'')"
style="position:absolute;left:<a href=” tel:+442330”=””>-2330</a>px;" src=h</iframe>
这个漏洞发生在服务器端代码上,这就导致电话号码可被点击。当初无法复现是因为我的安卓本地化设置被设置为英国,导致号码被判断为有效的电话号码。其它地方的设置无法检测到电话号码,因此不存在这个漏洞问题。
于是,我重写了 PoC,使用的是完整的美国电话格式即xxx-xxx-xxxx,测试后发现不同地区设置都能复现。之后我将问题告知微软。2019年3月26日,微软确认了复现并在90天内提供了修复方案。
时间轴
2018-12-10:首先向 MSRC 披露
2019-01-16:发送漏洞的视频屏幕截图。微软无法复现。搁置。
2019-03-26:向 MSRC 发送全局 PoC
2019-03-26:微软确认复现
2019-06-20:微软发布修复方案
结论
CVE-2019-1105 的修复方案已发布,https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-1105。建议个人和企业用户及时更新应用程序,降低已知漏洞遭利用的风险。另外,我们应该查找并报告漏洞问题,从而能够使用更安全的产品,而且应该尽快为系统打补丁。
原文链接
https://www.f5.com/labs/articles/threat-intelligence/how-i-hacked-the-microsoft-outlook-android-app-and-found-cve-2019-1105
题图:Pixabay License
本文由奇安信代码卫士编译,不代表奇安信观点,转载请注明“转自奇安信代码卫士 www.codesafe.cn”。
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的产品线。